import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.TreeSet;

public class Main837 {

	static Scanner sc = new Scanner(System.in);

	static List<BigDecimal> pontosIniciaisDosFilmes;
	static List<BigDecimal> pontosFinaisDosFilmes;
	static List<BigDecimal> coeficientesDosFilmes;

	static List<BigDecimal> divisoresDeIntervalo;

	public static void main(String[] args) {

		int numeroDeCT = Integer.parseInt(sc.nextLine());
		sc.nextLine();

		for (int contCT = 0; contCT < numeroDeCT; contCT++) {

			int numeroDeFilmes = Integer.parseInt(sc.nextLine());

			carregaDados(numeroDeFilmes);

			imprimeQuantidadeDeIntervalos();

			imprimeResultadoParaIntervaloEntreMenosInfinitoEPrimeiroPonto();
			imprimeResultadosParaIntervalosIntermediarios();
			imprimeResultadoParaIntervaloEntreUltimoPontoEMaisInfinito();

			pulaLinhaSeNaoForUltimoCT(numeroDeCT, contCT);

		}

	}

	private static void carregaDados(int numeroDeFilmes) {

		pontosIniciaisDosFilmes = new ArrayList<BigDecimal>();
		pontosFinaisDosFilmes = new ArrayList<BigDecimal>();
		coeficientesDosFilmes = new ArrayList<BigDecimal>();

		carregaFilmes(numeroDeFilmes);
		carregaDivisoresDeIntervalo(pontosIniciaisDosFilmes, pontosFinaisDosFilmes);

	}

	private static void imprimeResultadosParaIntervalosIntermediarios() {

		for (int divisorDeIntervaloAtual = 0; divisorDeIntervaloAtual < divisoresDeIntervalo.size() - 1; divisorDeIntervaloAtual++) {

			BigDecimal inicioIntervalo = divisoresDeIntervalo.get(divisorDeIntervaloAtual);
			BigDecimal fimIntervalo = divisoresDeIntervalo.get(divisorDeIntervaloAtual + 1);

			BigDecimal resultado = calculaPercentualDeLuzQuePassaNoIntervalo(inicioIntervalo, fimIntervalo);

			imprimeResultadoParaIntervaloEntre(inicioIntervalo, fimIntervalo, resultado);

		}
	}
	
	private static BigDecimal calculaPercentualDeLuzQuePassaNoIntervalo(BigDecimal pontoInicialIntervalo, BigDecimal pontoFinalIntervalo) {

		BigDecimal resultado = new BigDecimal("1");

		for (int intervaloAtual = 0; intervaloAtual < pontosIniciaisDosFilmes.size(); intervaloAtual++) {

			if (filmeEstahNoIntervalo(pontoInicialIntervalo, pontoFinalIntervalo, intervaloAtual)) {
				resultado = resultado.multiply(coeficientesDosFilmes.get(intervaloAtual));
			}

		}
		return resultado;
	}
	
	private static boolean filmeEstahNoIntervalo(BigDecimal pontoInicialIntervalo, BigDecimal pontoFinalIntervalo, int intervaloAtual) {
		return pontoInicialIntervalo.compareTo(pontosIniciaisDosFilmes.get(intervaloAtual)) >= 0 && 
				pontoFinalIntervalo.compareTo(pontosFinaisDosFilmes.get(intervaloAtual)) <= 0;
	}
	
	private static void imprimeResultadoParaIntervaloEntre(BigDecimal inicioIntervalo, BigDecimal fimIntervalo, BigDecimal percentualDeLuz) {
		System.out.println(inicioIntervalo + " " + fimIntervalo + " " + percentualDeLuz.setScale(3, BigDecimal.ROUND_HALF_UP));
	}

	private static void imprimeResultadoParaIntervaloEntreMenosInfinitoEPrimeiroPonto() {
		System.out.println("-inf " + divisoresDeIntervalo.get(0) + " 1.000");
	}

	private static void imprimeQuantidadeDeIntervalos() {
		System.out.println(divisoresDeIntervalo.size() + 1);
	}

	private static void imprimeResultadoParaIntervaloEntreUltimoPontoEMaisInfinito() {
		System.out.println(divisoresDeIntervalo.get(divisoresDeIntervalo.size() - 1) + " " + "+inf 1.000");
	}

	private static void pulaLinhaSeNaoForUltimoCT(int numeroDeCT, int contCT) {
		if (naoEhUltimoCT(numeroDeCT, contCT)) {
			System.out.println();
			sc.nextLine();
		}
	}

	private static void carregaFilmes(int numeroDeFilmes) {

		for (int i = 0; i < numeroDeFilmes; i++) {

			String[] entradas = sc.nextLine().split(" ");

			BigDecimal ponto1 = new BigDecimal(entradas[0]).setScale(3, BigDecimal.ROUND_HALF_UP);
			BigDecimal ponto2 = new BigDecimal(entradas[2]).setScale(3, BigDecimal.ROUND_HALF_UP);
			coeficientesDosFilmes.add(new BigDecimal(entradas[4]));
			
			if (ponto2.compareTo(ponto1) > 0) { // ponto 2 > ponto1

				pontosIniciaisDosFilmes.add(ponto1);
				pontosFinaisDosFilmes.add(ponto2);

			} else { // ponto 2 > ponto1

				pontosIniciaisDosFilmes.add(ponto2);
				pontosFinaisDosFilmes.add(ponto1);

			}

		}

	}

	private static boolean naoEhUltimoCT(int numeroDeCT, int j) {
		return j != numeroDeCT - 1;
	}

	private static void carregaDivisoresDeIntervalo(List<BigDecimal> lista1, List<BigDecimal> lista2) {

		TreeSet<BigDecimal> treeSet = new TreeSet<BigDecimal>(lista1);
		treeSet.addAll(lista2);

		List<BigDecimal> resposta = new ArrayList<BigDecimal>();

		for (BigDecimal d : treeSet) {
			resposta.add(d);
		}

		divisoresDeIntervalo = resposta;
	}
}
